From cccd45319705e3e9ad9bc812027d55c5a2bcea73 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 19 Mar 2008 10:20:17 +0000 Subject: [PATCH] xend: Fix and improve default NUMA node selection. Add the missing condition check and use average value instead of the sum value of Vcpus pinning cpus on certain node to choose relaxed node. Signed-off-by: Duan Ronghui --- tools/python/xen/xend/XendDomainInfo.py | 54 ++++++++++++++----------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index a8e934ef62..f057d7c0a9 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -2062,36 +2062,44 @@ class XendDomainInfo: for v in range(0, self.info['VCPUs_max']): xc.vcpu_setaffinity(self.domid, v, self.info['cpus']) else: + def find_relaxed_node(node_list): + import sys + if node_list is None: + node_list = range(0, info['nr_nodes']) + nodeload = [0] + nodeload = nodeload * info['nr_nodes'] + from xen.xend import XendDomain + doms = XendDomain.instance().list('all') + for dom in doms: + cpuinfo = dom.getVCPUInfo() + for vcpu in sxp.children(cpuinfo, 'vcpu'): + def vinfo(n, t): + return t(sxp.child_value(vcpu, n)) + cpumap = vinfo('cpumap', list) + for i in node_list: + node_cpumask = info['node_to_cpu'][i] + for j in node_cpumask: + if j in cpumap: + nodeload[i] += 1 + break + for i in node_list: + if len(info['node_to_cpu'][i]) > 0: + nodeload[i] = int(nodeload[i] / len(info['node_to_cpu'][i])) + else: + nodeload[i] = sys.maxint + index = nodeload.index( min(nodeload) ) + return index + info = xc.physinfo() if info['nr_nodes'] > 1: node_memory_list = info['node_to_memory'] needmem = self.image.getRequiredAvailableMemory(self.info['memory_dynamic_max']) / 1024 candidate_node_list = [] for i in range(0, info['nr_nodes']): - if node_memory_list[i] >= needmem: + if node_memory_list[i] >= needmem and len(info['node_to_cpu'][i]) > 0: candidate_node_list.append(i) - if candidate_node_list is None or len(candidate_node_list) == 1: - index = node_memory_list.index( max(node_memory_list) ) - cpumask = info['node_to_cpu'][index] - else: - nodeload = [0] - nodeload = nodeload * info['nr_nodes'] - from xen.xend import XendDomain - doms = XendDomain.instance().list('all') - for dom in doms: - cpuinfo = dom.getVCPUInfo() - for vcpu in sxp.children(cpuinfo, 'vcpu'): - def vinfo(n, t): - return t(sxp.child_value(vcpu, n)) - cpumap = vinfo('cpumap', list) - for i in candidate_node_list: - node_cpumask = info['node_to_cpu'][i] - for j in node_cpumask: - if j in cpumap: - nodeload[i] += 1 - break - index = nodeload.index( min(nodeload) ) - cpumask = info['node_to_cpu'][index] + index = find_relaxed_node(candidate_node_list) + cpumask = info['node_to_cpu'][index] for v in range(0, self.info['VCPUs_max']): xc.vcpu_setaffinity(self.domid, v, cpumask) -- 2.30.2